﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Reflection;
using System.IO;
using System.Diagnostics;
using System.Data.OleDb;

namespace template_dll
{
    public partial class ChildForm : Form
    {
        public ChildForm()
        {
            InitializeComponent();
        }

        private const string namechcol = "Флаг";
        private SqlConnection conn;
        private DataTable dt_rep;
        private DataTable dt_mir;
        private DataTable ph_cat;
        private delegate void Deleg();
        private struct date_str { public DateTime dt; public string dtname; }
        private date_str[] dt_str = new date_str[]{ };
        private string month;
        private DataTable dt_plan;
        private Deleg del;
        private int fl_int = 0;

        public static bool DisplayForm(System.Windows.Forms.Form theMDIParent)
        {
            ChildForm f = new ChildForm();
            f.MdiParent = theMDIParent;
            f.WindowState = FormWindowState.Maximized;
            f.Show();
            return true;
        }

        private string GetServ(string filename)
        {
            string str = "";
            using (StreamReader streamReader = new StreamReader(filename))
            {
                while (!streamReader.EndOfStream)
                {
                    str += streamReader.ReadLine();
                }
            }
            return str;
        }

        private void ChildForm_Load(object sender, EventArgs e)
        {
            try
            {
                conn = new SqlConnection(@"Server=" + GetServ("serv.txt") + ";Database=PharmOLAPDW;Integrated Security=True");
                dt_rep = new DataTable();
                dt_mir = new DataTable();
                dt_plan = new DataTable();
                ph_cat = new DataTable();
                SqlCommand getdate = conn.CreateCommand();
                getdate.CommandText = @"pas_MonthSel";
                getdate.CommandType = CommandType.StoredProcedure;
                DataTable date = new DataTable();
                if (conn.State == ConnectionState.Closed) conn.Open();
                date.Load(getdate.ExecuteReader());
                if (date.Rows.Count > 0)
                {
                    foreach (DataRow dr in date.Rows)
                    {
                        Array.Resize(ref dt_str, dt_str.Length + 1);
                        dt_str[dt_str.Length - 1].dt = Convert.ToDateTime(dr[0]);
                        dt_str[dt_str.Length - 1].dtname = dr[1].ToString();
                        comboBox1.Items.Add(dr[1].ToString());
                        if (DateTime.Now.Date.Month == Convert.ToDateTime(dr[0]).Month)
                            comboBox1.SelectedIndex = comboBox1.Items.Count - 1;
                    }

                }
                date = null;
                getdate = null;            
                toolStripStatusLabel1.Text = "";
                
                SqlCommand phcat = conn.CreateCommand();
                phcat.CommandText = "pas_PharmCatSel";
                phcat.CommandType = CommandType.StoredProcedure;
                if (conn.State == ConnectionState.Closed) conn.Open();
                ph_cat.Load(phcat.ExecuteReader());
                conn.Close();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void StartCreateRep(object sender, EventArgs e)
        {
            dataGridView1.Columns.Clear();
            dataGridView1.DataSource = null;
            dt_rep.Clear();
            month = comboBox1.Text;
            CreateRep();
            dataGridView1.DataSource = dt_rep.DefaultView;

            //del = new Deleg(CreateRep);
            //this.Text += " Формируется";
            //IAsyncResult asyncRes = del.BeginInvoke(new AsyncCallback(CallBackFunc), null); //
            //panel1.Enabled = false;
            //dataGridView1.Enabled = false;
            
        }

        private void CallBackFunc(IAsyncResult aRes)
        {
            del.EndInvoke(aRes);
            panel1.Invoke((Func<bool>)(() => panel1.Enabled = true));
            dataGridView1.Invoke((Func<bool>)(() => dataGridView1.Enabled = true));
            this.Invoke((Func<string>)(() => this.Text = this.Text.Replace(" Формируется", "")));
            dataGridView1.Invoke((Func<object>)(() => dataGridView1.DataSource = dt_rep.DefaultView));
        }

        private void CreateRep()
        {
            try
            {
                if (conn.State == ConnectionState.Closed) conn.Open();

                SqlCommand myCommand = conn.CreateCommand();
                myCommand.CommandType = CommandType.StoredProcedure;
                myCommand.CommandText = @"pas_PharmCategoryCalc";
                myCommand.CommandTimeout = 600;
                if (conn.State == ConnectionState.Closed) conn.Open();

                for (int i = 0; i < dt_str.Length; i++)
                {
                    if (dt_str[i].dtname == month)
                    {
                        myCommand.Parameters.AddWithValue("@month",dt_str[i].dt);
                        
                    }
                }                
                dt_rep = null;
                dt_rep = new DataTable();             
                dt_rep.Load(myCommand.ExecuteReader());
                dt_mir.Load(myCommand.ExecuteReader());
                for (int i = 0; i < dt_rep.Columns.Count; i++ )
                    if (i < 6) dt_rep.Columns[i].ReadOnly = true;
                    else dt_rep.Columns[i].ReadOnly = false;
                //if (dt_str[comboBox1.SelectedIndex].dt < DateTime.Today) checkBox1.Checked = true;
               
                //dt_rep.Columns[12].ReadOnly = false;
                //dt_rep.Columns[19].ReadOnly = false;
                //dt_rep.Columns[21].ReadOnly = false;
                //dt_rep.Columns[23].ReadOnly = false;
                //dt_rep.Columns[24].ReadOnly = false;
                //dt_rep.Columns[25].ReadOnly = false;

                //statusStrip1.Invoke((Func<string>)(() => statusStrip1.Items[0].Text = "Всего аптек: " + Convert.ToInt32(myCommand.Parameters["@countpharm"].Value).ToString("n0")));
                statusStrip1.Items[0].Text = "Всего аптек: " + dataGridView1.RowCount.ToString();
                conn.Close();
                myCommand = null;
            }
            catch (Exception ex)
            {
                //this.Invoke((Func<DialogResult>)(() => MessageBox.Show(ex.ToString())));
                MessageBox.Show(ex.ToString());
                conn.Close();
            }

        }

        private void ExpToExcel(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.FileName = "Планирование";
            sfd.Filter = "Excel | *.xls";
            if (sfd.ShowDialog() == DialogResult.OK)
            {   
                SaveDGVToCSVfile(sfd.FileName.ToString(), dataGridView1, true);
            }
        }

        public static bool SaveDGVToCSVfile(string filename, DataGridView table, bool openInExcel)
        {
            try
            {
                StreamWriter sw = new StreamWriter(filename, false, Encoding.Unicode);

                List<int> col_n = new List<int>();
                foreach (DataGridViewColumn col in table.Columns)
                    if (col.Visible)
                    {
                        sw.Write(col.HeaderText + "\t");
                        col_n.Add(col.Index);
                    }
                sw.WriteLine();
                int x = table.RowCount;
                if (table.AllowUserToAddRows) x--;

                for (int i = 0; i < x; i++)
                {
                    for (int y = 0; y < col_n.Count; y++)
                        sw.Write(table[col_n[y], i].Value + "\t");
                    sw.Write(" \r\n");
                }
                sw.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return false;
            }

            if (openInExcel)
            {
                try
                {
                    Process newProc = Process.Start("excel.exe", "\"" + filename + "\"");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
            }
            return true;
        }

        private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            
            //try
            //{
            //    SqlCommand upd = conn.CreateCommand();
            //    upd.CommandType = CommandType.StoredProcedure;
            //    upd.CommandText = @"pas_URS_PlanIns";

            //    int row = dataGridView1.CurrentCell.RowIndex;
            //    int col = dataGridView1.CurrentCell.ColumnIndex;
                
            //    upd.Parameters.AddWithValue("@pharmcode", dataGridView1["Код", dataGridView1.CurrentCell.RowIndex].Value);
            //    upd.Parameters.AddWithValue("@opp_urs", dataGridView1["План продаж", dataGridView1.CurrentCell.RowIndex].Value);
            //    upd.Parameters.AddWithValue("@strat", dataGridView1["План продаж - стратегия", dataGridView1.CurrentCell.RowIndex].Value);
            //    upd.Parameters.AddWithValue("@ssp", dataGridView1["ССП план", dataGridView1.CurrentCell.RowIndex].Value);
            //    upd.Parameters.AddWithValue("@conv", dataGridView1["Конвертация план", dataGridView1.CurrentCell.RowIndex].Value);
            //    upd.Parameters.AddWithValue("@mplan", dataGridView1["Фармацевты план", dataGridView1.CurrentCell.RowIndex].Value);
            //    upd.Parameters.AddWithValue("@mfact", dataGridView1["Фармацевты факт", dataGridView1.CurrentCell.RowIndex].Value);
            //    upd.Parameters.AddWithValue("@opp", dataGridView1["План продаж утвержденный", dataGridView1.CurrentCell.RowIndex].Value);
            //    for (int i = 0; i < dt_str.Length; i++)
            //    {
            //        if (dt_str[i].dt.Date.ToString() == dataGridView1["Месяц", dataGridView1.CurrentCell.RowIndex].Value.ToString())
            //            upd.Parameters.AddWithValue("@month", dt_str[i].dt);
            //    }
            //    upd.Parameters.Add("@RetVal", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
            //    if (conn.State == ConnectionState.Closed) conn.Open();
            //    upd.ExecuteScalar();
            //    int ret = (int)upd.Parameters["@RetVal"].Value;
            //    if (ret == 2 || ret == 0)
            //    {
            //        MessageBox.Show("Изменения не сохранены");
            //        dataGridView1.CurrentCell = dataGridView1[col, row];
            //        dataGridView1.CurrentCell.Value = val;
            //    }
            //}
            //catch (Exception ex)
            //{
            //    MessageBox.Show(ex.ToString());
            //}
        }



        private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            MessageBox.Show(e.Exception.ToString());
        }

        private void dataGridView1_DataSourceChanged(object sender, EventArgs e)
        {
            if (dataGridView1.DataSource != null)
            {
                DataGridViewComboBoxCell cbcell = new DataGridViewComboBoxCell();
                foreach (DataRow dr in ph_cat.Rows)
                {
                    cbcell.Items.Add(dr[0]);
                }
                DataGridViewColumn cbcol = new DataGridViewColumn(cbcell);
                cbcol.Name = "Категория планируемая";
                dataGridView1.Columns.Add(cbcol);

                DataGridViewComboBoxCell cbcell_ph = new DataGridViewComboBoxCell();

                foreach (DataGridViewRow dr in dataGridView1.Rows)
                    cbcell_ph.Items.Add(dr.Cells["Код аптеки для рассчета1"].Value);

                DataGridViewColumn cdc = new DataGridViewColumn(cbcell_ph);
                cdc.Name = "Код аптеки для рассчета";
                dataGridView1.Columns.Add(cdc);
                dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;

                dataGridView1.Columns["Код аптеки для рассчета1"].Visible = false;
                dataGridView1.Columns["Категория планируемая1"].Visible = false;
                dataGridView1.Columns["Код аптеки для рассчета"].DisplayIndex = dataGridView1.Columns["Код аптеки для рассчета1"].DisplayIndex;
                dataGridView1.Columns["Категория планируемая"].DisplayIndex = dataGridView1.Columns["Категория по динамике"].DisplayIndex + 1;
                foreach (DataGridViewRow dr in dataGridView1.Rows)
                {
                    dr.Cells["Код аптеки для рассчета"].Value = dr.Cells["Код аптеки для рассчета1"].Value;
                    dr.Cells["Категория планируемая"].Value = dr.Cells["Категория планируемая1"].Value;
                    if (dr.Cells["Категория планируемая"].Value == DBNull.Value || dr.Cells["Категория планируемая"].Value == null)
                        dr.Cells["Категория планируемая"].Style.BackColor = Color.Red;
                    if (Convert.ToInt32(dr.Cells["Отработано месяцев"].Value) < 18)
                        dr.DefaultCellStyle.BackColor = Color.Yellow;
                }
                foreach (DataGridViewColumn column in dataGridView1.Columns)
                {
                    column.SortMode = DataGridViewColumnSortMode.NotSortable;
                    if (column.Index < 8) column.Frozen = true;
                }
                dataGridView1.Columns["Код аптеки"].Width = 50;
                dataGridView1.Columns["Категория прошлого месяца"].Width = 50;
                dataGridView1.Columns["Сумма прошлого месяца"].Width = 60;
                dataGridView1.Columns["Планируемый месяц"].Width = 70;
                dataGridView1.Columns["Отработано месяцев"].Width = 50;
                dataGridView1.Columns["Код аптеки для рассчета"].Width = 50;
            }
        }

        private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
         /*   try
            {
                for (int i = 0; i < dataGridView1.ColumnCount; i++)
                {
                    if (Convert.ToInt32(dataGridView1["Отработано месяцев", i].Value) < 18)
                        dataGridView1["Отработано месяцев", i].Style.BackColor = Color.Yellow;

                    Color c = new Color();
                    if (dataGridView1["Код аптеки", i].Value.ToString() == dataGridView1["Код аптеки для рассчета", i].Value.ToString())
                        c = dataGridView1["Код аптеки", i].Style.BackColor;
                    else c = Color.SkyBlue;

                    for (int ii = 0; ii < dataGridView1.ColumnCount; ii++)
                        if (dataGridView1.Columns[ii].DisplayIndex >= dataGridView1.Columns["Код аптеки для рассчета"].DisplayIndex)
                            dataGridView1[ii, i].Style.BackColor = c;

                    if (dataGridView1["Категория планируемая", i].Value == DBNull.Value || dataGridView1["Категория планируемая", i].Value == null)
                        dataGridView1["Категория планируемая", i].Style.BackColor = Color.Red;
                    else
                        if (dataGridView1["Категория по динамике", i].Value.ToString() != dataGridView1["Категория планируемая", i].Value.ToString()
                            || dataGridView1["Категория по среднему", i].Value.ToString() != dataGridView1["Категория планируемая", i].Value.ToString())
                            dataGridView1["Категория планируемая", i].Style.BackColor = Color.SkyBlue;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }*/
        }

        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
                  try
                  {
                      if (dataGridView1.Columns[e.ColumnIndex].Name == "Категория планируемая")
                      {
                      //    if (e.RowIndex == 0) MessageBox.Show("2");
                          if (dataGridView1[e.ColumnIndex, e.RowIndex].Value == null || dataGridView1[e.ColumnIndex, e.RowIndex].Value == DBNull.Value || dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString() == "")
                              dataGridView1[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Red;
                          else
                              if (dataGridView1["Категория по динамике", e.RowIndex].Value.ToString() == dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString()
                                  && dataGridView1["Категория по среднему", e.RowIndex].Value.ToString() == dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString())
                                  dataGridView1[e.ColumnIndex, e.RowIndex].Style.BackColor = dataGridView1["Категория по динамике", e.RowIndex].Style.BackColor;
                              else dataGridView1[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.SkyBlue;
                                  //if (dataGridView1["Категория по динамике", e.RowIndex].Value.ToString() == dataGridView1["Категория по среднему", e.RowIndex].Value.ToString()
                          //           && dataGridView1[e.ColumnIndex,e.RowIndex].Value.ToString() == dataGridView1["Категория по динамике", e.RowIndex].Value.ToString())
                          //    dataGridView1[e.ColumnIndex,e.ColumnIndex].Style.BackColor = dataGridView1["Категория по динамике", e.RowIndex].Style.BackColor;
                          //else
                          //    dataGridView1[e.ColumnIndex,e.RowIndex].Style.BackColor = Color.Green;
                          dataGridView1["Категория планируемая1", e.RowIndex].Value = dataGridView1["Категория планируемая", e.RowIndex].Value;
                      }
                      if (dataGridView1.Columns[e.ColumnIndex].Name == "Код аптеки для рассчета")
                      {
                          Color c = new Color();
                          if (dataGridView1["Код аптеки", e.RowIndex].Value.ToString() == dataGridView1[e.ColumnIndex,e.RowIndex].Value.ToString())
                              c = dataGridView1["Код аптеки", dataGridView1.CurrentCell.RowIndex].Style.BackColor;
                          else c = Color.SkyBlue;
                          //if (c == Color.SkyBlue) MessageBox.Show("1 " + e.ColumnIndex.ToString() + " " + e.RowIndex.ToString());
                          //dataGridView1.CurrentCell.Value = Convert.ToInt32(dataGridView1.CurrentCell.Value);
                          int rowindex = -1;
                          for (int i = 0; i < dt_mir.Rows.Count; i++)
                              if (dt_mir.Rows[i]["Код аптеки"].ToString() == dataGridView1[e.ColumnIndex,e.RowIndex].Value.ToString())//Convert.ToInt32()
                              {
                                  rowindex = i;
                               //   fl_int++;
                               //   MessageBox.Show(fl_int.ToString());
                              }
                         // if (c == Color.SkyBlue) MessageBox.Show("2 " + e.ColumnIndex.ToString() + " " + e.RowIndex.ToString());

                          for (int i = 0; i < dataGridView1.ColumnCount; i++)
                          {
                              if (dataGridView1.Columns[i].DisplayIndex >= dataGridView1.Columns[e.ColumnIndex].DisplayIndex)//dataGridView1[e.ColumnIndex, e.RowIndex].OwningColumn.DisplayIndex)
                              {
                                  for (int j = 0; j < dt_mir.Columns.Count; j++)
                                  {
                                      if (dt_mir.Columns[j].ColumnName == dataGridView1.Columns[i].Name && dt_rep.Columns[j].ReadOnly == false)
                                          dataGridView1[i, e.RowIndex].Value = dt_mir.Rows[rowindex][j];
                                      if (dataGridView1.Columns[i].Name == "Категория планируемая")
                                          dataGridView1[i, e.RowIndex].Value = dt_mir.Rows[rowindex]["Категория планируемая1"];
                                  }
                                  if (dataGridView1.Columns[i].Name == "Категория планируемая" && (dataGridView1[i, e.RowIndex].Value == DBNull.Value || dataGridView1[i, e.RowIndex].Value == null || dataGridView1[i, e.RowIndex].Value.ToString() == ""))
                                      dataGridView1[i, e.RowIndex].Style.BackColor = Color.Red;
                                  else dataGridView1[i, e.RowIndex].Style.BackColor = c;
                              }
                          }
                          dataGridView1["Код аптеки для рассчета1", e.RowIndex].Value = dataGridView1["Код аптеки для рассчета", e.RowIndex].Value;
                      }
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show(ex.ToString());
                  }
        }

        private void dataGridView1_Sorted(object sender, EventArgs e)
        {
            //try
            //{            
            //    for (int i = 0; i < dataGridView1.RowCount; i++)
            //    {
            //        dataGridView1["Категория планируемая", i].Value = dataGridView1["Категория планируемая1", i].Value;
            //        dataGridView1["Код аптеки для рассчета", i].Value = dataGridView1["Код аптеки для рассчета1", i].Value; 
                    


            //        Color c = new Color();
            //        if (dataGridView1["Код аптеки", i].Value.ToString() == dataGridView1["Код аптеки для рассчета", i].Value.ToString())
            //            c = dataGridView1["Код аптеки", i].Style.BackColor;
            //        else c = Color.SkyBlue;

            //        for (int ii = 0; ii < dataGridView1.ColumnCount; ii++)
            //        {
            //            if (Convert.ToInt32(dataGridView1["Отработано месяцев", i].Value) < 18)
            //                dataGridView1[ii, i].Style.BackColor = Color.Yellow;
            //            else dataGridView1[ii, i].Style.BackColor = Color.White;
            //            if (dataGridView1["Код аптеки", i].Value.ToString() == dataGridView1["Код аптеки для рассчета", i].Value.ToString())
            //                dataGridView1[ii, i].Style.BackColor = dataGridView1[0, i].Style.BackColor;
            //            else
            //                if (dataGridView1.Columns[ii].DisplayIndex >= dataGridView1.Columns["Код аптеки для рассчета"].DisplayIndex)
            //                    dataGridView1[ii, i].Style.BackColor = Color.SkyBlue;
            //        }
            //        if (dataGridView1["Категория планируемая", i].Value == DBNull.Value || dataGridView1["Категория планируемая", i].Value == null)
            //            dataGridView1["Категория планируемая", i].Style.BackColor = Color.Red;
            //        else
            //            if (dataGridView1["Категория по динамике", i].Value.ToString() != dataGridView1["Категория планируемая", i].Value.ToString()
            //                || dataGridView1["Категория по среднему", i].Value.ToString() != dataGridView1["Категория планируемая", i].Value.ToString())
            //                dataGridView1["Категория планируемая", i].Style.BackColor = Color.SkyBlue;
            //    }
            //}
            //catch (Exception ex)
            //{
            //    MessageBox.Show(ex.ToString());
            //}
        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                bool fl = true;
                foreach (DataGridViewRow dr in dataGridView1.Rows)
                {
                    if (dr.Cells["Категория планируемая"].Value == DBNull.Value || dr.Cells["Категория планируемая"].Value.ToString() == "")
                    {
                        fl = false;
                        MessageBox.Show("Не проставлена категория у аптеки\n" + dr.Cells["Код аптеки"].Value.ToString() + " " + dr.Cells["Аптека"].Value.ToString());
                        break;
                    }
                }
                if (fl)
                {
                    SqlCommand com = conn.CreateCommand();
                    com.CommandText = "pas_PharmCategoryIns";
                    com.CommandType = CommandType.StoredProcedure;
                    com.Parameters.Add("@pharm",SqlDbType.Int);
                    com.Parameters.Add("@month",SqlDbType.Date);
                    com.Parameters.Add("@pharm_calc",SqlDbType.Int);
                    com.Parameters.Add("@plan_cat", SqlDbType.VarChar, 2);
                    
                    if (conn.State == ConnectionState.Closed) conn.Open();
                    foreach (DataGridViewRow dr in dataGridView1.Rows)
                    {
                        com.Parameters["@pharm"].Value = Convert.ToInt32(dr.Cells["Код аптеки"].Value);
                        com.Parameters["@month"].Value = dr.Cells["Планируемый месяц"].Value;
                        com.Parameters["@pharm_calc"].Value = Convert.ToInt32(dr.Cells["Код аптеки для рассчета"].Value);
                        com.Parameters["@plan_cat"].Value = dr.Cells["Категория планируемая"].Value;
                        
                        com.ExecuteNonQuery();
                    }

                    MessageBox.Show("Данные сохранены");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}
